﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using WoSoft.Camera.ImgEdit;
using System.Reflection;
using System.Diagnostics;
using WoSoft.PACS.Win.Properties;
using System.Runtime.InteropServices;
using WoSoft.PACS.Data.CheckData;
using System.IO;

namespace WoSoft.PACS.Win.Forms.SubForms
{
    public partial class FrmImageEdit : FrmBase
    {
        private Image _img;
        private string _checkappID;
        private string _id;

        Point mouseDownPoint = new Point(); //记录拖拽过程鼠标位置
        bool isMove = false;    //判断鼠标在picturebox上移动时，是否处于拖拽过程(鼠标左键是否按下)
        int zoomStep = 20;      //缩放步长

        public FrmImageEdit()
        {
            InitializeComponent();
        }

        public FrmImageEdit(Image img, string checkappID)
        {
            InitializeComponent();
            _img = img;
            _checkappID = checkappID;
            this.pictureBox.Image = _img;
        }

        public FrmImageEdit(Image img, string checkappID,string id)
        {
            InitializeComponent();
            _img = img;
            _checkappID = checkappID;
            _id = id;
            this.pictureBox.Image = _img;

            SetButtonSelect();
            pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
        }

        private void SetButtonSelect()
        {
            if (_checkapp.Exists_检查图像记录(_checkappID, _id))
            {
                btnSelect.Text = "取消";
                btnSelect.Symbol = "";
            }
            else
            {
                btnSelect.Text = "选择";
                btnSelect.Symbol = "";
            }
        }

        private void pictureBox_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                mouseDownPoint.X = Cursor.Position.X;
                mouseDownPoint.Y = Cursor.Position.Y;
                isMove = true;
                pictureBox.Focus();
            }

            if (e.Button == MouseButtons.Right)
            {
                //this.Close();
                this.DialogResult = DialogResult.OK;
            }
        }

        private void pictureBox_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                isMove = false;
            }
        }

        private void pictureBox_MouseMove(object sender, MouseEventArgs e)
        {
            pictureBox.Focus();
            if (isMove)
            {
                int x, y;
                int moveX, moveY;
                moveX = Cursor.Position.X - mouseDownPoint.X;
                moveY = Cursor.Position.Y - mouseDownPoint.Y;
                x = pictureBox.Location.X + moveX;
                y = pictureBox.Location.Y + moveY;
                pictureBox.Location = new Point(x, y);
                mouseDownPoint.X = Cursor.Position.X;
                mouseDownPoint.Y = Cursor.Position.Y;
            }
        }

        private void pictureBox_MouseWheel(object sender, MouseEventArgs e)
        {
            int x = e.Location.X;
            int y = e.Location.Y;
            int ow = pictureBox.Width;
            int oh = pictureBox.Height;
            int VX, VY;
            if (e.Delta > 0)
            {
                pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
                pictureBox.Width += zoomStep;
                pictureBox.Height += zoomStep;

                PropertyInfo pInfo = pictureBox.GetType().GetProperty("ImageRectangle", BindingFlags.Instance |
                    BindingFlags.NonPublic);
                Rectangle rect = (Rectangle)pInfo.GetValue(pictureBox, null);

                pictureBox.Width = rect.Width;
                pictureBox.Height = rect.Height;
            }
            if (e.Delta < 0)
            {
                pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
                if (pictureBox.Width < _img.Width / 10)
                    return;

                pictureBox.Width -= zoomStep;
                pictureBox.Height -= zoomStep;
                PropertyInfo pInfo = pictureBox.GetType().GetProperty("ImageRectangle", BindingFlags.Instance |
                    BindingFlags.NonPublic);
                Rectangle rect = (Rectangle)pInfo.GetValue(pictureBox, null);
                pictureBox.Width = rect.Width;
                pictureBox.Height = rect.Height;
            }

            VX = (int)((double)x * (ow - pictureBox.Width) / ow);
            VY = (int)((double)y * (oh - pictureBox.Height) / oh);
            pictureBox.Location = new Point(pictureBox.Location.X + VX, pictureBox.Location.Y + VY);
        }

        private void panel_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                mouseDownPoint.X = Cursor.Position.X;
                mouseDownPoint.Y = Cursor.Position.Y;
                isMove = true;
            }
        }

        private void panel_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                isMove = false;
            }
        }

        private void panel_MouseMove(object sender, MouseEventArgs e)
        {
            panel.Focus();
            if (isMove)
            {
                int x, y;
                int moveX, moveY;
                moveX = Cursor.Position.X - mouseDownPoint.X;
                moveY = Cursor.Position.Y - mouseDownPoint.Y;
                x = pictureBox.Location.X + moveX;
                y = pictureBox.Location.Y + moveY;
                pictureBox.Location = new Point(x, y);
                mouseDownPoint.X = Cursor.Position.X;
                mouseDownPoint.Y = Cursor.Position.Y;
            }
        }

        private void contextMenuStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            int ow = pictureBox.Width;
            int oh = pictureBox.Height;
            switch (e.ClickedItem.Name)
            {
                case "放大ToolStripMenuItem":
                    pictureBox_MouseWheel(null, new MouseEventArgs(System.Windows.Forms.MouseButtons.Middle, 1, Control.MousePosition.X, Control.MousePosition.Y, 1));
                    break;
                case "缩小ToolStripMenuItem":
                    pictureBox_MouseWheel(null, new MouseEventArgs(System.Windows.Forms.MouseButtons.Middle, 1, Control.MousePosition.X, Control.MousePosition.Y, -1));
                    break;
                case "旋转90ToolStripMenuItem":
                    _img.RotateFlip(RotateFlipType.Rotate90FlipNone);
                    this.pictureBox.Image = _img;
                    break;
                case "旋转180ToolStripMenuItem":
                    _img.RotateFlip(RotateFlipType.Rotate180FlipNone);
                    this.pictureBox.Image = _img;
                    break;
                default:
                    break;
            }
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.OK;
            //this.Close();
        }

        CheckApp _checkapp = new CheckApp();

        private void btnNext_Click(object sender, EventArgs e)
        {
            var imgList = _checkapp.GetImage_Temp(_checkappID);
            for (int i = 0; i < imgList.Count; i++)
            {
                if (imgList[i].ImageBytes != null)
                {
                    if (imgList[i].ID == _id && i > 0)//不是第一张
                    {
                        _id = imgList[i - 1].ID;
                        _img = ByteToImage(imgList[i - 1].ImageBytes);
                        this.pictureBox.Image = _img;
                        //this.pictureBox.Image = ByteToImage(imgList[i - 1].ImageBytes);
                        break;
                    }
                }
            }

            SetButtonSelect();
            pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
        }

        private void btnPre_Click(object sender, EventArgs e)
        {
            var imgList = _checkapp.GetImage_Temp(_checkappID);
            for (int i = 0; i < imgList.Count; i++)
            {
                if (imgList[i].ImageBytes != null)
                {
                    if (imgList[i].ID == _id && i < imgList.Count - 1)//不是最后一张
                    {
                        _id = imgList[i + 1].ID;
                        _img = ByteToImage(imgList[i + 1].ImageBytes);
                        this.pictureBox.Image = _img;
                        //this.pictureBox.Image = ByteToImage(imgList[i + 1].ImageBytes);
                        break;
                    }
                }
            }

            SetButtonSelect();
            pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
        }


        #region bVk参数 常量定义

        public const byte vbKeyLButton = 0x1;    // 鼠标左键
        public const byte vbKeyRButton = 0x2;    // 鼠标右键
        public const byte vbKeyCancel = 0x3;     // CANCEL 键
        public const byte vbKeyMButton = 0x4;    // 鼠标中键
        public const byte vbKeyBack = 0x8;       // BACKSPACE 键
        public const byte vbKeyTab = 0x9;        // TAB 键
        public const byte vbKeyClear = 0xC;      // CLEAR 键
        public const byte vbKeyReturn = 0xD;     // ENTER 键
        public const byte vbKeyShift = 0x10;     // SHIFT 键
        public const byte vbKeyControl = 0x11;   // CTRL 键
        public const byte vbKeyAlt = 18;         // Alt 键  (键码18)
        public const byte vbKeyMenu = 0x12;      // MENU 键
        public const byte vbKeyPause = 0x13;     // PAUSE 键
        public const byte vbKeyCapital = 0x14;   // CAPS LOCK 键
        public const byte vbKeyEscape = 0x1B;    // ESC 键
        public const byte vbKeySpace = 0x20;     // SPACEBAR 键
        public const byte vbKeyPageUp = 0x21;    // PAGE UP 键
        public const byte vbKeyEnd = 0x23;       // End 键
        public const byte vbKeyHome = 0x24;      // HOME 键
        public const byte vbKeyLeft = 0x25;      // LEFT ARROW 键
        public const byte vbKeyUp = 0x26;        // UP ARROW 键
        public const byte vbKeyRight = 0x27;     // RIGHT ARROW 键
        public const byte vbKeyDown = 0x28;      // DOWN ARROW 键
        public const byte vbKeySelect = 0x29;    // Select 键
        public const byte vbKeyPrint = 0x2A;     // PRINT SCREEN 键
        public const byte vbKeyExecute = 0x2B;   // EXECUTE 键
        public const byte vbKeySnapshot = 0x2C;  // SNAPSHOT 键
        public const byte vbKeyDelete = 0x2E;    // Delete 键
        public const byte vbKeyHelp = 0x2F;      // HELP 键
        public const byte vbKeyNumlock = 0x90;   // NUM LOCK 键

        //常用键 字母键A到Z
        public const byte vbKeyA = 65;
        public const byte vbKeyB = 66;
        public const byte vbKeyC = 67;
        public const byte vbKeyD = 68;
        public const byte vbKeyE = 69;
        public const byte vbKeyF = 70;
        public const byte vbKeyG = 71;
        public const byte vbKeyH = 72;
        public const byte vbKeyI = 73;
        public const byte vbKeyJ = 74;
        public const byte vbKeyK = 75;
        public const byte vbKeyL = 76;
        public const byte vbKeyM = 77;
        public const byte vbKeyN = 78;
        public const byte vbKeyO = 79;
        public const byte vbKeyP = 80;
        public const byte vbKeyQ = 81;
        public const byte vbKeyR = 82;
        public const byte vbKeyS = 83;
        public const byte vbKeyT = 84;
        public const byte vbKeyU = 85;
        public const byte vbKeyV = 86;
        public const byte vbKeyW = 87;
        public const byte vbKeyX = 88;
        public const byte vbKeyY = 89;
        public const byte vbKeyZ = 90;

        //数字键盘0到9
        public const byte vbKey0 = 48;    // 0 键
        public const byte vbKey1 = 49;    // 1 键
        public const byte vbKey2 = 50;    // 2 键
        public const byte vbKey3 = 51;    // 3 键
        public const byte vbKey4 = 52;    // 4 键
        public const byte vbKey5 = 53;    // 5 键
        public const byte vbKey6 = 54;    // 6 键
        public const byte vbKey7 = 55;    // 7 键
        public const byte vbKey8 = 56;    // 8 键
        public const byte vbKey9 = 57;    // 9 键


        public const byte vbKeyNumpad0 = 0x60;    //0 键
        public const byte vbKeyNumpad1 = 0x61;    //1 键
        public const byte vbKeyNumpad2 = 0x62;    //2 键
        public const byte vbKeyNumpad3 = 0x63;    //3 键
        public const byte vbKeyNumpad4 = 0x64;    //4 键
        public const byte vbKeyNumpad5 = 0x65;    //5 键
        public const byte vbKeyNumpad6 = 0x66;    //6 键
        public const byte vbKeyNumpad7 = 0x67;    //7 键
        public const byte vbKeyNumpad8 = 0x68;    //8 键
        public const byte vbKeyNumpad9 = 0x69;    //9 键
        public const byte vbKeyMultiply = 0x6A;   // MULTIPLICATIONSIGN(*)键
        public const byte vbKeyAdd = 0x6B;        // PLUS SIGN(+) 键
        public const byte vbKeySeparator = 0x6C;  // ENTER 键
        public const byte vbKeySubtract = 0x6D;   // MINUS SIGN(-) 键
        public const byte vbKeyDecimal = 0x6E;    // DECIMAL POINT(.) 键
        public const byte vbKeyDivide = 0x6F;     // DIVISION SIGN(/) 键


        //F1到F12按键
        public const byte vbKeyF1 = 0x70;   //F1 键
        public const byte vbKeyF2 = 0x71;   //F2 键
        public const byte vbKeyF3 = 0x72;   //F3 键
        public const byte vbKeyF4 = 0x73;   //F4 键
        public const byte vbKeyF5 = 0x74;   //F5 键
        public const byte vbKeyF6 = 0x75;   //F6 键
        public const byte vbKeyF7 = 0x76;   //F7 键
        public const byte vbKeyF8 = 0x77;   //F8 键
        public const byte vbKeyF9 = 0x78;   //F9 键
        public const byte vbKeyF10 = 0x79;  //F10 键
        public const byte vbKeyF11 = 0x7A;  //F11 键
        public const byte vbKeyF12 = 0x7B;  //F12 键

        #endregion

        #region 引用win32api方法

        /// <summary>
        /// 导入模拟键盘的方法
        /// </summary>
        /// <param name="bVk" >按键的虚拟键值</param>
        /// <param name= "bScan" >扫描码，一般不用设置，用0代替就行</param>
        /// <param name= "dwFlags" >选项标志：0：表示按下，2：表示松开</param>
        /// <param name= "dwExtraInfo">一般设置为0</param>
        [DllImport("user32.dll")]
        public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

        #endregion

        private void btnCap_Click(object sender, EventArgs e)
        {
            byte bk=Convert.ToByte(Settings.Default.SendKey);
            //模拟按下ctrl键
            keybd_event(vbKeyControl, 0, 0, 0);
            //模拟按下Alt键
            keybd_event(vbKeyAlt, 0, 0, 0);
            //模拟按下A键
            keybd_event(bk, 0, 0, 0);
            //模拟松开ctrl键
            keybd_event(vbKeyControl, 0, 2, 0);
            //模拟松开Alt键
            keybd_event(vbKeyAlt, 0, 2, 0);
            //模拟松开A键
            keybd_event(bk, 0, 2, 0);
        }
        
        private void FrmImageEdit_Load(object sender, EventArgs e)
        {
            System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcessesByName("ScreenCutter");
            if (myProcesses.Length < 1) Process.Start(Application.StartupPath + @"\ScreenCutter.exe");

            pictureBox.Width = panel.Width;
            pictureBox.Height = panel.Height;
            pictureBox.Location = panel.Location;
        }

        private void bt_放大_Click(object sender, EventArgs e)
        {
            pictureBox_MouseWheel(null, new MouseEventArgs(System.Windows.Forms.MouseButtons.Middle, 1, Control.MousePosition.X, Control.MousePosition.Y, 1));
        }

        private void bt_缩小_Click(object sender, EventArgs e)
        {
            pictureBox_MouseWheel(null, new MouseEventArgs(System.Windows.Forms.MouseButtons.Middle, 1, Control.MousePosition.X, Control.MousePosition.Y, -1));
        }

        private void bt_旋转90_Click(object sender, EventArgs e)
        {
            _img.RotateFlip(RotateFlipType.Rotate90FlipNone);
            this.pictureBox.Image = _img;
        }

        private void bt_旋转180_Click(object sender, EventArgs e)
        {
            _img.RotateFlip(RotateFlipType.Rotate180FlipNone);
            this.pictureBox.Image = _img;
        }

        private void btnSelect_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(this._checkappID)) return;

            if (btnSelect.Text == "选择")
            {
                //var timeFolder = DateTime.Now.ToString("yyyyMMdd");
                //var imgPath = Path.Combine(Application.StartupPath, "CaptureImages", timeFolder, _id + ".jpg");
                //var imgFolder = Path.Combine(Application.StartupPath, "CaptureImages", timeFolder);
                //if (!File.Exists(imgPath))
                //{//文件不存在,则创建
                //    if (!Directory.Exists(imgFolder))
                //    {//检查文件目录是否存在,不存在,则创建
                //        Directory.CreateDirectory(imgFolder);
                //    }
                //    _img.Save(imgPath);
                //}

                //this._checkapp.SaveImage(_id, this._checkappID, FileToByte(imgPath));
                this._checkapp.CopyImage(this._checkappID, _id);
                
                btnSelect.Text = "取消";
                btnSelect.Symbol = "";
            }
            else
            {
                this._checkapp.DeleteImage(_id, _checkappID);

                btnSelect.Text = "选择";
                btnSelect.Symbol = "";
            }
        }

        private void FrmImageEdit_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.DialogResult = DialogResult.OK;
        }
    }
}
